package com.ebt.m.proposal_v2.mvp.contract;

import android.app.Activity;
import android.support.v4.app.FragmentManager;

import com.ebt.m.data.entity.Customer;
import com.ebt.m.proposal_v2.bean.ApplicantEntity;
import com.ebt.m.proposal_v2.bean.ArgProposalDetail;
import com.ebt.m.proposal_v2.bean.InsuranceEntity;
import com.ebt.m.proposal_v2.bean.InsuredEntity;
import com.ebt.m.proposal_v2.bean.ProposalEntity;
import com.ebt.m.proposal_v2.dao.request.ParamGetRisks;
import com.ebt.m.proposal_v2.dao.response.BusinessConfig;
import com.ebt.m.proposal_v2.mvp.base.IPresenter;
import com.ebt.m.proposal_v2.mvp.base.IView;

import java.util.List;

/**
 * @author archer.qi
 *         Created on 2017/5/15.
 */
public interface ProposalMakeContract {

    interface View extends IView {

        /**
         * 初始化TopBar/BottomBar
         */
        void initSideBar();

        /**
         * 初始化生成按钮
         */
        void initBtnMakeProposal();

        /**
         * 初始化投保人
         */
        void initApplicantView();

        /**
         * 初始化被保人
         */
        void initInsuredView();

        /**
         * 初始化险种
         */
        void initInsuranceViews();

        /**
         * 初始化生产资料
         */
        void initProposalProduct();

        /**
         * 获取FragmentManager
         *
         * @return
         */
        FragmentManager getFrgManager();

        /**
         * 添加主附险
         *
         * @param data
         */
        void addInsuranceView(InsuranceEntity data);

        /**
         * 滚动到底部
         */
        void scrollToBottom();

        /**
         * 检测是否允许制作计划书
         */
        void checkProposalMakeAllowed();

        /**
         * 显示Tip
         *
         * @param msg
         */
        void showToast(String msg);

        /**
         * 关闭当前页面
         */
        void finishActivity();
        /**
         * 关闭当前页面
         */
        void finishCustomActivity();

        /**
         * 跳转到详情
         */
        void gotoProposalDetail(ArgProposalDetail arg);

        /**
         * 获取计划书数据
         *
         * @return
         */
        ProposalEntity getProposal();

        /**
         * 投保人数据
         *
         * @return
         */
        ApplicantEntity getApplicant();

        /**
         * 被保人数据
         *
         * @return
         */
        InsuredEntity getInsured();

        /**
         * 主险数据
         *
         * @return
         */
        InsuranceEntity getMain();

        /**
         * 根据标识初始化
         */
        void initByFlag();

        /**
         * 初始化草稿入口
         */
        void initWithDraft();


        /**
         * 初始化客户入口
         */
        void initWithCustomer();

        /**
         * 初始化产品入口
         */
        void initWithProduct();

        /**
         * 初始化首页入口
         */
        void initWithDynamic();

        /**
         * 获取总保费/总保额
         *
         * @return 【0】 保额 【1】 保费
         */
        double[] getTotalPremiumAndCoverage();

        /**
         * 提交计划书之前，检查
         *
         * @return
         */
        boolean checkBeforeMakeProposal(ProposalEntity entity);

        /**
         * 设置是否可以生成计划书
         *
         * @param enabled
         */
        void setMakeProposalEnabled(boolean enabled);

        /**
         * 更新投保人
         *
         * @param customer
         */
        void updateApplicant(Customer customer, ApplicantEntity applicant);

        /**
         * 更新第一被保人
         *
         * @param customer
         */
        void updateInsured(Customer customer, InsuredEntity insured);

        /**
         * 更新除去第一被保人外其它被保人
         */
        void updateOtherInsured(List<InsuredEntity> insuredEntities);

        /**
         * 批量添加产品
         *
         * @param list
         */
        void addRiskViews(List<InsuranceEntity> list);

        /**
         * 是否允许保存客户到客户列表
         *
         * @param allow
         */
        void allowSaveCustomer(boolean allow);

        void showProgress(String msg);

        void cancelProgress();

        /**
         * 从客户导入时，设置客户的原始姓名
         *
         * @param name
         */
        void setOriginCustomerName(String name);

        /**
         * 显示提示信息窗口
         *
         * @param tip
         */
        void showTipDialog(String tip);

        /**
         * 草稿加载完毕后，更新产品的投保人与被保人
         *
         * @param applicant
         * @param insured
         */
        void updateInsurancePerson(ApplicantEntity applicant, InsuredEntity insured);

        /**
         * 是否是从草稿进入编辑
         *
         * @return
         */
        boolean isProposalDraft();

        /**
         * 设置总保费显示
         */
        void setTotalPremiumValue(String value);

        /**
         * 从产品进入制作计划书，获取产品信息后，更新投保人与被保人信息
         *
         * @param customer
         */
        void initPersonAfterProductGetted(Customer customer);

        /**
         * 设置草稿保存状态
         *
         * @param saving
         */
        void setDraftSaving(boolean saving);

        /**
         * 显示更多被保人
         */
        void showMoreInsuredView(boolean show);

        /**
         * 能否添加更多被保人
         *
         * @return
         */
        boolean canAddMore();

        /**
         * 是否显示添加更多被保人的按钮
         *
         * @return
         */
        void updateShowMoreInsureButton();

        /**
         * 主险变更后，更新businessConfig
         */
        void updateBusinessConfig(BusinessConfig businessConfig);
        /**
         * 检测产品投保选项是否匹配性别、年龄、职业类别
         *
         * @return
         */
        boolean checkProductOption();
        /**
         * 是否有多被保人
         *
         * @return
         */
        boolean hasMoreInsuredAndInsuranceView();

        void showEmpty(boolean empty, boolean no_net, boolean net_slow);

        void checkToProposalList();

        boolean checkDraftSame();

        void onDraftDownloadFinished();

        void displayProductPropertiyImg(String url);

    }

    interface Presenter extends IPresenter {

        /**
         * 添加主险
         */
        void addMainProduct(Activity activity, ParamGetRisks param);

        /**
         * 选择完附加险之后添加到显示
         */
        void addAdditionalViewAfterChoose(List<InsuranceEntity> dataList);

        /**
         * 公司是否注册
         *
         * @return
         */
        boolean isCompanyRegistered();

        /**
         * 是否登录
         *
         * @return
         */
        boolean isLogined();

        /**
         * 保存为计划书草稿
         *
         * @param proposal
         */
        void saveToProposalDraft(ProposalEntity proposal);

        /**
         * 制作计划书
         *
         * @param proposal
         */
        void makeProposal(ProposalEntity proposal);

        /**
         * 创建投保人
         *
         * @param customer
         */
        void createCustomer(Customer customer, ProposalEntity proposal);

        /**
         * 更新投保人
         *
         * @param customer
         */
        void updateCustomer(Customer customer, ProposalEntity proposal);

        /**
         * 执行点击制作计划书的操作
         *
         * @param allowSave 是否允许保存到客户列表
         * @param customer  投保人客户
         * @param proposal  计划书数据
         */
        void doMakeProposal(boolean allowSave, Customer customer, String originCustomerName, ProposalEntity proposal);

        /**
         * 获取计划书草稿
         *
         * @param proposalId
         */
        void getProposalDraft(String proposalId);

        /**
         * 根据用户ID下载用户信息
         *
         * @param customerId
         */
        void getCustomerDetail(String customerId);

        /**
         * 获取产品参数以及附带附加险
         *
         * @param productId
         */
        void getProductDetail(InsuranceEntity product, String productId, String age, int sex, int profession);

        /**
         * 获取产品参数以及附带附加险->从首页进入，附带投、被保人信息
         *
         * @param productId
         */
        void getDefaultMainProductDetails(String productId);

        /**
         * 在保存草稿或生成计划书成功后，发送刷新事件，刷新计划书列表
         */
        void sendNotifyEventAfterSaveDraftOrMakeProposal();

        /**
         * 计划书校验
         *
         * @param proposal
         * @param isFinalVerify 是否是最终的检测
         */
        void checkProposal(boolean allowSave, Customer customer, String originCustomerName, ProposalEntity proposal, boolean isFinalVerify);

        /**
         * 检查投被保人关系
         */
        boolean checkRelation(int resRelationCode, ProposalEntity entity);

        /**
         * 获取产品属性
         */
        void getProductProperties(int productId);

    }
}
